<?php if (!defined('BASEPATH'))exit('No direct script access allowed');

include_once 'main.php';

/**
 * Controller para ações de Empréstimos
 * 
 * @author Douglas Rafael
 * @package controllers     
 */
class Emprestimo extends Main {

    public function __construct() {
        parent::__construct();
        //Verifica se o usuário estar logado no sistema
        $this->verificaLogado();
        
        //carrega a class nescessárias
        $this->load->model('DAOEmprestimo');
        $this->load->helper('text');

        //Seta propriedades do template
        $this->template->set('title', 'Gerenciamento de Empréstimos || ' . $this->title);
        $this->template->set('page_title', 'Gerenciamento de Empréstimos');
        $this->template->set('page_infor', '<h2 class="title-infor">informações gerais</h2>
                        <p>Os empréstimos <span class="bold">INATIVOS</span>, são destacados em vermelho.</p>
                        <p>Os empréstimos <span class="bold">ATIVOS, MAS COM DATA DE ENTREGA VENCIDA</span>, são destacados em amarelo.</p>
                        <p><span class="bold">Só exclua um EMPRÉSTIMO se for realmente necessário. Pois uma vez deletando não será possivel recuperar ou conter informações do empréstimo nos relatórios...</span></p>
                        <p class="bold"><span class="bold">ALT + N</span> Abre o formulário para cadastrar um novo Empréstimo.</p>
                        <p><span class="bold">ESC</span> Fecha o formulário.</p>
                        <p><span class="bold">Duplo clique</span> sobre o registro, abre formulário para edição dos dados.</p>
                        <p><span class="atencion">ATENÇÃO</span></p>
                        <p>1° - <span class="bold">O sistema sinaliza automaticamente o empréstimo como FINALIZADO, quando todos os ITENS do empréstimo forem devolvidos...</span></p>
                        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &bull; Para isso, vá em editar o empréstimo e <span class="bold">informe o total dos itens que foram entregues.</span></p>
                        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &bull; Se o empréstimo foi de 3 itens e apenas 2 foram devolvidos, o empréstimo continuará como ATIVO, até o restante for devolvido e marcado como entreggue.</p>
                        <p>2° - Caso seja necessário realizar <span class="bold">RENOVAÇÃO</span>, o empréstimo do usuário deverá ser finalizado e realizado um novo com os itens desejados.</p>');
    }

    public function index() {
        $this->listar();
    }
    
    /**
     * Lista os empréstimos
     */
    public function listar() {
        try {
            $this->verificaPermissao(ControleAcesso::CONSULTAR_EMPRESTIMO);
            
            $arr_js = $this->config->item('js');
            array_push($arr_js, 'maskedinput');
            array_push($arr_js, 'jquery.cookie');
            $this->template->load_js($arr_js);

            // Removendo a variavel 'searchterm' da sessão
            $this->session->unset_userdata('searchterm');

            $init = ($this->uri->segment(6)) ? $this->uri->segment(6) : 0;
            $this->treat_orderby(); // Tratar orderby

            $total_pagina = $this->uri->segment(5) ? $this->uri->segment(5) : 10;
            $emprestimos = $this->DAOEmprestimo->select_all_loans($init, $total_pagina, $this->order_by, $this->direction); 
            $total_rows = $this->DAOEmprestimo->amount_all_loan();
            

            // paginação
            $config['uri_segment'] = 6;
            $config['per_page'] = $total_pagina;
            $config['base_url'] = base_url() . "emprestimo/listar/" . $this->order_by_name . "/" . $this->direction_name . '/' . $total_pagina;
            $config['total_rows'] = $total_rows;
            $this->pagination->initialize($config);
            
            $data['emprestimos'] = $emprestimos;
            $data['total_rows'] = $this->treat_number_rows($total_rows);
            $data['pagination'] = $this->pagination->create_links();
            $data['quant_list'] = $total_pagina;
            
            //Carrega a view com os dados
            $this->template->load(NULL, 'emprestimo_list', $data);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_loan();
        }
    }
    
    
    /**
     * Cadastra Empréstimo
     * 
     * @throws ExceptionValidacao
     */
    public function cadastrar() {
        try {
            $this->verificaPermissao(ControleAcesso::CADASTRAR_EMPRESTIMO);
            $this->load->library('form_validation');
            $this->form_validation->set_rules("itens_id", "Item", "required|min_length[6]|xss_clean");
            $this->input->post('itens_id', TRUE) ? $this->form_validation->set_rules("total_itens[]", "Total do item", "required|is_natural_no_zero|min_length[1]|xss_clean") : "";
            if($this->input->post('usuario', TRUE)){
                $this->form_validation->set_rules("usuario_id", "Usuário", "trim|required|is_natural|min_length[6]|max_length[6]|xss_clean");
                $this->form_validation->set_rules("usuario", "Usuário", "trim|required|xss_clean");
            }else{
                $this->form_validation->set_rules("usuario", "Usuário", "trim|required|xss_clean");
            }
            $this->form_validation->set_rules("data_saida", "Data de saída", "trim|required|valid_date|xss_clean");
            $this->form_validation->set_rules("data_retorno", "Data de retorno", "trim|required|valid_date|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $emprestimo = new TOEmprestimo();
                $emprestimo->usuario = new TOUsuario();
                $emprestimo->usuario->id = $this->input->post('usuario_id', TRUE);
                $emprestimo->usuario->nome = $this->input->post('usuario', TRUE);
                $emprestimo->data_saida = format_date($this->input->post('data_saida', TRUE), FALSE, TRUE);
                $emprestimo->data_retorno = format_date($this->input->post('data_retorno', TRUE), FALSE, FALSE);
                $emprestimo->usuario_admin = new TOUsuario();
                $emprestimo->usuario_admin->id = $this->get_user_logged();
                $emprestimo->emprestimo_item = array();
                $itens = explode(',', $this->input->post('itens_id', TRUE));
                $total_itens = $this->input->post('total_itens', TRUE);

                //Atributos temporários... Apenas para o método check_loan_apt
                $emprestimo->total_itens = count($itens);

                /**
                 * Verifica se é possível realizar o empréstimo. 2 tipos de verificações é feita:
                 * - 1° Verifica parâmetros de configurações do EMPRÉSTIMO, como o total de empréstimos ativos para cadas usuário...
                 * - 2° Verifica se o ITEM está apto para empréstimos, checando algumas configurações nativas do sistema, como total disponível... 
                 */
                $this->DAOEmprestimo->check_loan_apt($emprestimo);

                $this->load->model('DAOItem');
                foreach ($itens as $key=> $item_vez) {
                    $emprestimo_item = new TOEmprestimoItem();
                    $emprestimo_item->item = new TOItem();
                    $emprestimo_item->item = $this->DAOItem->get_item_simple($item_vez);
                    $emprestimo_item->total  = $total_itens[$key];
                    $emprestimo_item->status = 1;
                    $emprestimo->emprestimo_item[] = $emprestimo_item;
                    
                    //Verifica se itens estão aptos para o empréstimo
                    if($this->DAOEmprestimo->check_availability_item($emprestimo_item->item, $emprestimo_item->total) != NULL) {
                        throw new ExceptionValidacao("<span class='bold'>Não é possível realizar o empréstimo.</span> " . $this->DAOEmprestimo->check_availability_item($emprestimo_item->item, $emprestimo_item->total));
                    }
                }
                
                //SE TUDO FOI OK ATÉ AQUI >> Insere o empréstimo
                $this->DAOEmprestimo->insert_loan($emprestimo);
                // Salva na sessão atualizações
                Main::check_config();

                Mensagem::setMensagemSucesso("Empréstimo para usuário(a):<span class='bold'> " . $emprestimo->usuario->nome . " </span>realizado com sucesso.");
                $this->index();
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }
    
  
    /**
     * Busca por empréstimos
     */
    public function buscar() {
        try {
            //Carregando Helpers
            $this->load->helper('text');

            $searchterm = $this->searchtermHandler($this->input->get_post('search_term', TRUE));
            $init = ($this->uri->segment(6)) ? $this->uri->segment(6) : 0;
            $this->treat_orderby(); // Tratar orderby

            $total_pagina = $this->uri->segment(5) ? $this->uri->segment(5) : 10;
            $emprestimos  =  $this->DAOEmprestimo->search_loan($init, $total_pagina, $searchterm, $this->order_by, $this->direction);
            $total_rows   =  $this->DAOEmprestimo->amount_search_loan($searchterm);

            // paginação
            $config['uri_segment'] = 6;
            $config['per_page'] = $total_pagina;
            $config['base_url'] = base_url() . "emprestimo/buscar/" . $this->order_by_name . "/" . $this->direction_name . "/" . $total_pagina;
            $config['total_rows'] = $total_rows;
            $this->pagination->initialize($config);

            $data['emprestimos'] = $emprestimos;
            $data['total_rows'] = $this->treat_number_rows($total_rows);
            $data['pagination'] = $this->pagination->create_links();
            $data['quant_list'] = $total_pagina;

            if ($total_rows == 0)
                Mensagem::setMensagem("Nenhum registro foi encontrado para essa pesquisa: <span class='bold'> $searchterm </span>", "aviso");

            //Carrega a view com os dados
            $this->template->load(NULL, 'emprestimo_list', $data);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->listar();
        }
    }
    
    
    /**
     * Abre formulário para exibição e atualização do empréstimo
     * 
     * @param type $codigo_emprestimo
     * @throws Exception
     */
    public function atualizar($codigo_emprestimo) {
       try {
            $this->load->helper('html');

            $check_item = $this->DAOEmprestimo->check_loan($codigo_emprestimo);

            // Verificação se o item selecionado é válido para a edição
            if ($codigo_emprestimo == NULL || $check_item != TRUE) {
                throw new Exception('Não foi possível selecionar o item para edição dos registros. Tente novamente!');
            } else {
                $this->template->set('title', 'Atualizar Empréstimo || ' . $this->title);
                $this->template->set('page_title', 'Atualizar dados do empréstimo');
                $this->template->set('page_infor', '<h2 class="title-infor">informações gerais</h2>
                        <p><span class="bold">Só exclua um EMPRÉSTIMO se for realmente necessário. Pois uma vez deletando não será possivel recuperar ou conter informações do empréstimo nos relatórios...</span></p>
                        <p><span class="atencion">ATENÇÃO</span></p>
                        <p>1° - <span class="bold">O sistema sinaliza automaticamente o empréstimo como FINALIZADO, quando todos os ITENS do empréstimo forem devolvidos...</span></p>
                        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &bull; Para isso, vá em editar o empréstimo e <span class="bold">informe o total dos itens que foram entregues.</span></p>
                        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &bull; Se o empréstimo foi de 3 itens e apenas 2 foram devolvidos, o empréstimo continuará como ATIVO, até o restante for devolvido e marcado como entreggue.</p>
                        <p>2° - Caso seja necessário realizar <span class="bold">RENOVAÇÃO</span>, o empréstimo do usuário deverá ser finalizado e realizado um novo com os itens desejados.</p>');
                
                /** Pegando os dados necessários para a view **/
                $emprestimo = new TOEmprestimo();
                $emprestimo->id = $codigo_emprestimo;
                $data['emprestimo'] = $this->DAOEmprestimo->get_loan($emprestimo);
                
                // Selecionando a multa, caso o empréstimo tenha
                $this->load->model('DAOMulta');
                $data['multa'] = $this->DAOMulta->get_fine_loan($data['emprestimo']->id);
                
                //Monta um array com os status dos sub-emprestimos dos itens
                $status_item = array();
                foreach ($data['emprestimo']->emprestimo_item as $emprestimo_item) {
                    array_push($status_item, $emprestimo_item->status);
                }
                //Pegando o status geral do empréstimo de acordo com os status dos sub-emprestimos
                $data['str_status'] = $this->DAOEmprestimo->check_status_loan( $data['emprestimo'], 1);

                //Emprestidmo do usuário Admin
                $data['total_loan_admin'] = $this->DAOEmprestimo->amount_all_loan_user($data['emprestimo']->usuario_admin->id, TRUE);
                $data['total_loan_ativo_admin'] = $this->DAOEmprestimo->amount_all_loan_user($data['emprestimo']->usuario_admin->id, TRUE, TRUE);
                
                // Emprestimos do usuario
                $data['total_loan_usuario'] = $this->DAOEmprestimo->amount_all_loan_user($data['emprestimo']->usuario->id, FALSE);
                $data['total_loan_usuario_ativo'] = $this->DAOEmprestimo->amount_all_loan_user($data['emprestimo']->usuario->id, FALSE, TRUE);
                $data['tempo_loan'] = diff_date(date_american($data['emprestimo']->data_saida), date_american($data['emprestimo']->data_retorno));
                $data['tempo_loan_restante'] = diff_date(date('Y-m-d'), date_american($data['emprestimo']->data_retorno));
                
                $this->template->load(NULL, 'emprestimo_edit', $data);
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }
    
    
    /**
     * Atualiza dados do empréstimo, verificando as possíveis exceções
     * 
     * @throws ExceptionValidacao
     */
    public function confirma_atualizar() {
        try {
            $this->verificaPermissao(ControleAcesso::ATUALIZAR_EMPRESTIMO);

            $codigo_emprestimo = $this->input->post('codigo_emprestimo', TRUE);

            $this->load->library('form_validation');
            $this->form_validation->set_rules("data_saida", "Data de saída", "trim|required|valid_date|xss_clean");
            $this->form_validation->set_rules("data_retorno", "data de retorno", "trim|required|valid_date|xss_clean");
            $this->form_validation->set_rules("codigo_emprestimo", "Código", "trim|required|is_natural|exact_lenght[6]|xss_clean");
            $this->form_validation->set_rules("codigo_item[]", "Código Item", "trim|required|is_natural|min_length[6]|max_length[6]|xss_clean");
            $this->form_validation->set_rules("total_devolvido[]", "Total Devolvido", "trim|required|is_natural|min_length[1]|max_length[2]|xss_clean");
            $this->form_validation->set_rules("total_emprestado[]", "Total Emprestado", "trim|required|is_natural|min_length[2]|max_length[2]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {

                $itens = $this->input->post('codigo_item', TRUE); // Array contendo os codigos dos itens
                $total_devolver = $this->input->post('total_devolvido', TRUE); // Array contendo os totais dos itens a devolver
                $total_emprestado = $this->input->post('total_emprestado', TRUE);

                $emprestimo = new TOEmprestimo();
                $emprestimo->id = $codigo_emprestimo;
                $emprestimo->data_saida = $this->input->post('data_saida', TRUE);
                $emprestimo->data_retorno = $this->input->post('data_retorno', TRUE);
                $emprestimo->emprestimo_item = array();

                //Preparando dados para o model
                foreach ($itens as $index => $item) {
                    $emprestimo_item = new TOEmprestimoItem();
                    $emprestimo_item->total = $total_emprestado[$index];
                    $emprestimo_item->total_devolvido = string_fill($total_devolver[$index], 2, 0);
                    $emprestimo_item->item = new TOItem();
                    $emprestimo_item->item->codigo = $item;

                    if ($emprestimo_item->total == $total_devolver[$index]) {
                        $emprestimo_item->status = 0; // FIBALIZADO, Quantidade emprestada devolvida
                    } else {
                        $emprestimo_item->status = 1; // Empretismo permanece ativo
                    }
                    array_push($emprestimo->emprestimo_item, $emprestimo_item);
                }
              
                //SE TUDO FOI ok ATÉ AQUI >> Insere o item
                $this->DAOEmprestimo->update_loan_item($emprestimo);
                // Salva na sessão atualizações
                Main::check_config();

                Mensagem::setMensagemSucesso("Empréstimo de n°::<span class='bold'> " . $codigo_emprestimo . " </span>atualizado com sucesso.");
                $this->atualizar($codigo_emprestimo);

            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->atualizar($codigo_emprestimo);
        }
    }
    
    
    /**
     * Exclui emprestimo
     */
    public function excluir() {
        try {
            $this->verificaPermissao(ControleAcesso::EXCLUIR_EMPRESTIMO);
            $this->load->library('form_validation');
            $this->form_validation->set_rules("codigoDelete", "Código", "trim|required|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $emprestimo =  new TOEmprestimo();
                $emprestimo->id = $this->input->post('codigoDelete', TRUE);
                
                $this->DAOEmprestimo->delete_loan($emprestimo->id);
                // Salva na sessão atualizações
                Main::check_config();
                
                Mensagem::setMensagemSucesso("Empréstimo de código: <span class='bold'>" . $emprestimo->id . "</span> excluído com sucesso.");
                
                $this->index();
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }
    
    
    /**
     * Retorna via json os empréstimos do usuário
     */
    public function get_loan_user_json() {
        try {
            $this->load->library('form_validation');
            $this->form_validation->set_rules("idUsuario", "Código", "trim|required|min_length[6]|max_length[6]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                echo validation_errors();
            } else {
                $emprestimos_user = $this->DAOEmprestimo->get_loans_user($this->input->post('idUsuario', TRUE));

                $emprestimos = array();
                foreach ($emprestimos_user as $key => $value) {
                    $status = $this->DAOEmprestimo->check_status_loan($value, 1);
                    $emprestimos[$value->id] = 'Código: ' . $value->id . ' | Saída: ' . format_date($value->data_saida, FALSE) . ' | Retorno: ' . format_date($value->data_retorno, FALSE) . ' | Status: ' . strtoupper($status);
                }
                $data['emprestimos_user'] = form_dropdown('emprestimo', $emprestimos, set_value('emprestimo'), 'id="emprestimo"');
                echo json_encode($data);
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_user();
        }
    }
    
    private function view_list_loan() {
        $this->template->load(NULL, 'emprestimo_list');
    }

}
